/* 
Symbol.iterator 迭代器 和 生成器 for of

支持遍历大部分类型迭代器 arr nodeList argumetns set map 等
*/

// 1.生成器 用法一样（迭代器）

function* gen() {
  yield Promise.resolve('小李') // yield 后面可以跟同步或者异步的表达式
  yield '大李'
  yield '超大李'
  yield '超超大李'
}

const man = gen()
console.log(man.next()) // { value: Promise { '小李' }, done: false }
console.log(man.next()) // { value: '大李', done: false }
console.log(man.next()) // { value: '超大李', done: false }
console.log(man.next()) // { value: '超超大李', done: false }
console.log(man.next()) // { value: undefined, done: true }

// 2.迭代器
// 3.set map  weakSet weakMap

let set:Set<number> = new Set([1,1,2,2,3,3])  // set 自动去重
console.log(set)

let map:Map<any,any> = new Map([['name','小明'],['age','18']])

let ArrSet = [1,2,3,4,5]
map.set(ArrSet, "小李") // 数组作为键名进行存储
console.log(map.get(ArrSet))

function args() {
  console.log(arguments)  // arguments 是一个伪数组，可以遍历
}

// let listSet = document.querySelectorAll("div")  // nodeList 伪数组
/* listSet.forEach((item) => {
  console.log(item)
}) */

// 核心代码
/* const eachSet = (value:any) => {
  let It: any = value[Symbol.iterator]()
  let next: any = { done: false }
  while(!next.done) {
    next = It.next()
    if(!next.done) {
      console.log(next.value)
    }
  }
}

eachSet([1,2,3,4,5,6,7,8,9,10])
eachSet(map) */

// 5.迭代器的语法糖 for of
/* for (let value of set) {
  console.log(value)
} */

// 6.for of 对象不能用
/* for (let value of {name: 1}) {
  console.log(value)
} */

// 7.解构 底层原理也是去调用  iterator
let arrSet = [1,2,3]
console.log(arrSet)
let copySet = [...arrSet]
console.log(copySet)

// 8.对象支持  for of
let objSet = {
  name: '小明',
  age: 18,
  max: 50,
  current: 0,
  [Symbol.iterator]() {
    return {
      max: this.max,
      current: this.current,
      next() {
        if(this.current === this.max) {
          return {
            value: undefined,
            done: true
          }
        } else {
          this.current++
          return {
            value: this.current,
            done: false
          }
        }
      }
    }
  }
}

for( let value of objSet) {
  console.log(value)
}

